<?php
// +---------------------------------------------------------------------+
// | OneBase    | [ WE CAN DO IT JUST THINK ]                            |
// +---------------------------------------------------------------------+
// | Licensed   | http://www.apache.org/licenses/LICENSE-2.0 )           |
// +---------------------------------------------------------------------+
// | Author     | 王勇程 <laughskydragon@qq.com>                         |
// +---------------------------------------------------------------------+
// | Repository | https://gitee.com/Bigotry/OneBase                      |
// +---------------------------------------------------------------------+

namespace app\common\logic;

/**
 * 广告业务逻辑
 */
class Advertisement extends LogicBase
{
    /**
     * 获取广告列表搜索条件
     */
    public function getWhere($data = [])
    {
        $where = [];
        
        // 搜索条件
        !empty($data['search_data']) && $where['a.title|a.content'] = ['like', '%'.$data['search_data'].'%'];
        
        // 位置条件
        !empty($data['position']) && $where['a.position'] = $data['position'];
        
        // 状态条件
        $where['a.status'] = isset($data['status']) ? intval($data['status']) : 1;
        
        return $where;
    }
    
    /**
     * 获取广告列表
     * @param array $where 查询条件
     * @param string $field 查询字段
     * @param string $order 排序
     * @param mixed $paginate 分页参数
     * @return array
     */
    public function getAdvertisementList($where = [], $field = 'a.*, p.path as cover_url', $order = 'a.sort ASC, a.id DESC', $paginate = DB_LIST_ROWS)
    {
        $this->modelAdvertisement->alias('a');

        $this->modelAdvertisement->join = [
            [SYS_DB_PREFIX.'picture p', 'a.cover_id = p.id', 'left'],
        ];

        return $this->modelAdvertisement->getList($where, $field, $order, $paginate);
    }
    
    /**
     * 获取首页广告列表
     * @param array $data 查询参数
     * @return array
     */
    public function getHomeAdvertisementList($data = [])
    {
        $position = $data['position'] ?? 'banner';
        $limit = $data['limit'] ?? 5;
        $userId = $data['user_id'] ?? 0;
        
        $list = $this->modelAdvertisement->getValidAdvertisementList($position, $limit);
        
        // 记录广告浏览日志
        if (!empty($list) && $userId > 0) {
            foreach ($list as $ad) {
                $this->modelAdvertisementLog->addViewLog($ad['id'], $userId);
            }
        }
        
        return [RESULT_SUCCESS, '获取成功', $list];
    }
    
    /**
     * 获取广告详情
     * @param array $data 查询参数
     * @return array
     */
    public function getAdvertisementInfo($data = [])
    {
        $id = $data['id'] ?? 0;
        $userId = $data['user_id'] ?? 0;
        
        if ($id <= 0) {
            return [RESULT_ERROR, '广告ID不能为空'];
        }
        
        $info = $this->modelAdvertisement->getInfo(['id' => $id]);
        if (empty($info)) {
            return [RESULT_ERROR, '广告不存在'];
        }
        
        // 检查广告是否有效
        if (!$this->modelAdvertisement->isValidAdvertisement($info)) {
            return [RESULT_ERROR, '广告已失效'];
        }
        
        // 记录广告浏览日志
        if ($userId > 0) {
            $this->modelAdvertisementLog->addViewLog($id, $userId);
        }
        
        $info['position_text'] = $this->modelAdvertisement->getPositionOptions()[$info['position']] ?? '未知';
        $info['status_text'] = $this->modelAdvertisement->getStatusOptions()[$info['status']] ?? '未知';
        
        return [RESULT_SUCCESS, '获取成功', $info];
    }
    
    /**
     * 记录广告点击
     * @param array $data 参数
     * @return array
     */
    public function recordAdvertisementClick($data = [])
    {
        $id = $data['id'] ?? 0;
        $userId = $data['user_id'] ?? 0;
        
        if ($id <= 0) {
            return [RESULT_ERROR, '广告ID不能为空'];
        }
        
        // 检查广告是否存在且有效
        $info = $this->modelAdvertisement->getInfo(['id' => $id]);
        if (empty($info)) {
            return [RESULT_ERROR, '广告不存在'];
        }
        
        if (!$this->modelAdvertisement->isValidAdvertisement($info)) {
            return [RESULT_ERROR, '广告已失效'];
        }
        
        // 记录点击日志
        $this->modelAdvertisementLog->addClickLog($id, $userId);
        
        return [RESULT_SUCCESS, '记录成功', ['link_url' => $info['link_url']]];
    }
    
    /**
     * 添加广告
     * @param array $data 广告数据
     * @return array
     */
    public function addAdvertisement($data = [])
    {
        // 过滤掉fileselect字段，避免数据库报错
        unset($data['fileselect']);
        // 验证必填字段
        if (empty($data['title'])) {
            return [RESULT_ERROR, '广告标题不能为空'];
        }
        
        if (empty($data['position'])) {
            return [RESULT_ERROR, '广告位置不能为空'];
        }
        
        // 验证位置是否有效
        $positionOptions = $this->modelAdvertisement->getPositionOptions();
        if (!isset($positionOptions[$data['position']])) {
            return [RESULT_ERROR, '广告位置无效'];
        }
        
        // 处理时间
        if (empty($data['start_time'])) {
            $data['start_time'] = date('Y-m-d H:i:s');
        }
        
        if (empty($data['end_time'])) {
            $data['end_time'] = date('Y-m-d H:i:s', time() + 30 * 86400); // 默认30天后过期
        }
        
        // 设置默认值
        $data['sort'] = $data['sort'] ?? 0;
        $data['status'] = $data['status'] ?? 1;
        
        $result = $this->modelAdvertisement->setInfo($data);
        
        if ($result) {
            return [RESULT_SUCCESS, '添加成功', ['id' => $result]];
        } else {
            return [RESULT_ERROR, '添加失败'];
        }
    }
    
    /**
     * 编辑广告
     * @param array $data 广告数据
     * @return array
     */
    public function editAdvertisement($data = [])
    {
        // 过滤掉fileselect字段，避免数据库报错
        unset($data['fileselect']);
        $id = $data['id'] ?? 0;
        
        if ($id <= 0) {
            return [RESULT_ERROR, '广告ID不能为空'];
        }
        
        // 检查广告是否存在
        $info = $this->modelAdvertisement->getInfo(['id' => $id]);
        if (empty($info)) {
            return [RESULT_ERROR, '广告不存在'];
        }
        
        // 验证位置是否有效
        if (!empty($data['position'])) {
            $positionOptions = $this->modelAdvertisement->getPositionOptions();
            if (!isset($positionOptions[$data['position']])) {
                return [RESULT_ERROR, '广告位置无效'];
            }
        }
        
        // 移除ID字段
        unset($data['id']);
        
        $result = $this->modelAdvertisement->updateInfo(['id' => $id], $data);
        
        if ($result !== false) {
            return [RESULT_SUCCESS, '编辑成功'];
        } else {
            return [RESULT_ERROR, '编辑失败'];
        }
    }
    
    /**
     * 删除广告
     * @param array $data 参数
     * @return array
     */
    public function deleteAdvertisement($data = [])
    {
        $id = $data['id'] ?? 0;
        
        if ($id <= 0) {
            return [RESULT_ERROR, '广告ID不能为空'];
        }
        
        // 检查广告是否存在
        $info = $this->modelAdvertisement->getInfo(['id' => $id]);
        if (empty($info)) {
            return [RESULT_ERROR, '广告不存在'];
        }
        
        $result = $this->modelAdvertisement->deleteInfo(['id' => $id]);
        
        if ($result) {
            return [RESULT_SUCCESS, '删除成功'];
        } else {
            return [RESULT_ERROR, '删除失败'];
        }
    }
    
    /**
     * 切换广告状态
     * @param array $data 参数
     * @return array
     */
    public function toggleAdvertisementStatus($data = [])
    {
        $id = $data['id'] ?? 0;
        
        if ($id <= 0) {
            return [RESULT_ERROR, '广告ID不能为空'];
        }
        
        $result = $this->modelAdvertisement->toggleStatus($id);
        
        if ($result) {
            return [RESULT_SUCCESS, '状态切换成功'];
        } else {
            return [RESULT_ERROR, '状态切换失败'];
        }
    }
    
    /**
     * 获取广告统计数据
     * @param array $data 参数
     * @return array
     */
    public function getAdvertisementStatistics($data = [])
    {
        $adId = $data['ad_id'] ?? 0;
        $startDate = $data['start_date'] ?? '';
        $endDate = $data['end_date'] ?? '';
        
        $stats = $this->modelAdvertisementLog->getStatistics($adId, '', $startDate, $endDate);
        
        // 计算点击率
        if ($adId > 0) {
            $stats['click_rate'] = $this->modelAdvertisementLog->getClickRate($adId, $startDate, $endDate);
        }
        
        return [RESULT_SUCCESS, '获取成功', $stats];
    }
    
    /**
     * 获取广告位置选项
     * @return array
     */
    public function getPositionOptions()
    {
        return [
            'banner' => '横幅广告',
            'sidebar' => '侧边栏广告',
            'popup' => '弹窗广告',
            'footer' => '底部广告',
            'content' => '内容广告'
        ];
    }
    
    /**
     * 获取广告状态选项
     * @return array
     */
    public function getStatusOptions()
    {
        return [
            0 => '禁用',
            1 => '启用'
        ];
    }
    
    /**
     * 广告编辑
     * @param array $data 广告数据
     * @return array
     */
    public function advertisementEdit($data = [])
    {
        $id = $data['id'] ?? 0;
        
        if (empty($id)) {
            // 新增广告
            return $this->addAdvertisement($data);
        } else {
            // 编辑广告
            return $this->editAdvertisement($data);
        }
    }
    
    /**
     * 广告删除
     * @param array $data 参数
     * @return array
     */
    public function advertisementDel($data = [])
    {
        return $this->deleteAdvertisement($data);
    }
    
    /**
     * 设置广告状态
     * @param array $data 参数
     * @return array
     */
    public function setAdvertisementStatus($data = [])
    {
        return $this->toggleAdvertisementStatus($data);
    }
    
    /**
     * 设置广告排序
     * @param array $data 参数
     * @return array
     */
    public function setAdvertisementSortOrder($data = [])
    {
        $id = $data['id'] ?? 0;
        $sortOrder = $data['sort'] ?? 0;
        
        if (!$id) {
            return [RESULT_ERROR, '广告ID不能为空'];
        }
        
        $result = $this->modelAdvertisement->updateInfo(['id' => $id], ['sort' => $sortOrder]);
        
        if ($result !== false) {
            return [RESULT_SUCCESS, '排序设置成功'];
        } else {
            return [RESULT_ERROR, '排序设置失败'];
        }
    }
    
    /**
     * 导出广告列表
     * @param array $where 查询条件
     */
    public function exportAdvertisementList($where = [])
    {
        $list = $this->modelAdvertisement->getList($where, true, 'sort DESC, id DESC', false);
        
        // 这里可以实现导出逻辑，比如生成Excel文件
        // 暂时返回成功
        return [RESULT_SUCCESS, '导出成功'];
    }
}